import { apiGetUserMenus } from '@/api/user'
import store from '@/store'

// 前端动态路由表
const constantRouterComponents = {
  // 开发演示
  'GridDemo': () => import('@/views/development/grid'),
  'PdfDemo': () => import('@/views/development/pdf')
}

// 前端未找到页面路由（固定不用改）
const notFoundRouter = {
  path: '*', redirect: '/404', hidden: true
}

// layout 根路由
const layoutRootRouter = {
  path: '/',
  component: () => import('@/layout'),
  redirect: '/home',
  children: []
}

/**
 * 动态生成Layout菜单
 * @param token
 * @returns {Promise<Router>}
 */
export const generatorDynamicLayoutRouter = (token) => {
  return new Promise((resolve, reject) => {
    apiGetUserMenus().then(res => {
      const userMenus = res.result
      // 后台菜单 生成路由信息
      generator(userMenus)
      const addRouters = []
      addRouters.push(layoutRootRouter)
      addRouters.push(notFoundRouter)
      store.dispatch('app/setRouters', addRouters)
      // 存储左边菜单信息
      const rootMenus = []
      const navMenus = rootMenus.concat(userMenus)
      store.dispatch('user/setUserMenus', navMenus)
      resolve()
    }).catch(err => {
      reject(err)
    })
  })
}

/**
 * 根据菜单URL生成路由
 * @param routerMap
 * @param parent
 * @returns {*}
 */
export const generator = (userMenu, parentMenu) => {
  /**
   * menuId: 菜单Id
   * menuName: 菜单名称
   * icon: 菜单图片
   * url: 菜单url
   * view: 菜单前端的物理视图: // 不可以不使用view， 用url对照页面path动态引入
   */

  userMenu.map(item => {
    // item.url: 菜单的网页URL  item.view：菜单的view值，是对用物理视图的关键
    if (item.url && item.view) {
      const pageComponents = constantRouterComponents[item.view]
      if (!pageComponents) {
        console.log('未找到物理视图：' + item.url)
      }
      const currentRouter = {
        path: item.url,
        name: item.view,
        component: pageComponents,
        meta: {
          isLeftMenu: true, // 左边菜单路由标识
          parentMenuKey: parentMenu ? parentMenu.menuId : '', // 父级id
          menuKey: item.menuId,
          icon: item.icon,
          title: item.menuName
        }
      }
      layoutRootRouter.children.push(currentRouter)
    }
    if (item.children && item.children.length > 0) {
      generator(item.children, item)
    }
  })
}

/**
 * 数组转树形结构
 * @param list 源数组
 * @param tree 树
 * @param parentId 父ID
 */
// const listToTree = (list, tree, parentId) => {
//   list.forEach(item => {
//     // 判断是否为父级菜单
//     if (item.parentId === parentId) {
//       const child = {
//         ...item,
//         key: item.key || item.name,
//         children: []
//       }
//       // 迭代 list， 找到当前菜单相符合的所有子菜单
//       listToTree(list, child.children, item.id)
//       // 删掉不存在 children 值的属性
//       if (child.children.length <= 0) {
//         delete child.children
//       }
//       // 加入到树中
//       tree.push(child)
//     }
//   })
// }
